package com.yuw.homework0803;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Scanner;

/*（1）从控制台输入一个目录，将该目录下的所有的文件，以及子目录中的所有的文件遍历出来；【递归和非递归两种方式实现】
 * （2）从控制台输入一个目录，和查找的关键字，将该目录下的所有的文件的文件名中包含改关键字的文件遍历出来；
 * 【递归和非递归两种方式实现】【提示可以使用FileFilter或者if条件语句】
 * 
 */
public class TestDriver {
	public static void main(String[] args) {
		test03();
	}

	private static void test011() {
		String str = "D:\\Help APIs\\Java\\jsp";
		File file0 = new File(str);
		System.out.println("isDirectory:" + file0.isDirectory());
		System.out.println("isFile:" + file0.isFile());
		// 依次递归该目录下的所有的文件对象
		String[] strSubFiles = file0.list(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				// 创建当前文件对象
				File file0 = new File(dir + File.separator + name);

				// 判定当前文件是目录还是文档
				if (file0.isDirectory()) {
					// 目录包含在list结果中
					return true;
				} else {
					// 如果是文件，则需要包含 查找关键字，才能包含在list结果中
					if (name != null && name.contains("")) {
					}
				}

				System.out.println("dir：" + dir);
				System.out.println("name：" + name);
				return false;
			}
		});
	}

	/**
	 * （1）从控制台输入一个目录，将该目录下的所有的文件，以及子目录中的所有的文件遍历出来；【递归和非递归两种方式实现】
	 */
	private static void test01() {
		System.out.println("请输入一个文件路径：");
		Scanner sc = new Scanner(System.in);
		String strFile = sc.nextLine();
		// 递归遍历
		printFiles_test01(strFile);
	}

	/**
	 * 递归打印文件目录下的所有的信息
	 * 
	 * @param strPath
	 *            文件路径
	 */
	private static void printFiles_test01(String strPath) {
		if (strPath != null && !strPath.equals("")) {
			File file0 = new File(strPath);
			// 判断该文件是目录还是文档
			if (file0.isDirectory()) {
				System.out.println("目录：" + file0.getAbsolutePath());
				// 依次递归该目录下的所有的文件对象
				String[] strSubFiles = file0.list();
				for (String strSub : strSubFiles) {
					// 递归调用，遍历当前目录
					printFiles_test01(file0.getAbsolutePath() + File.separator + strSub);
				}
			} else {
				System.out.println("文件：" + file0.getAbsolutePath());
			}
		}
	}

	/**
	 * （2）从控制台输入一个目录，和查找的关键字，将该目录下的所有的文件的文件名中包含改关键字的文件遍历出来；
	 * 【递归和非递归两种方式实现】【提示可以使用FileFilter或者if条件语句】
	 */
	private static void test02() {
		System.out.println("请输入一个文件路径：");
		Scanner sc = new Scanner(System.in);
		String strFile = sc.nextLine();
		System.out.println("请输入查找关键字：");
		String strKW = sc.nextLine();
		// 递归遍历
		printFiles_test02(strFile, strKW);
	}

	/**
	 * 递归打印文件目录下的所有的信息
	 * 
	 * @param strPath
	 *            文件路径
	 */
	private static void printFiles_test02(String strPath, String strKeyWords) {
		if (strPath != null && !strPath.equals("")) {
			File file0 = new File(strPath);
			// 判断该文件是目录还是文档
			if (file0.isDirectory()) {
				System.out.println("目录：" + file0.getAbsolutePath());
				// 依次递归该目录下的所有的文件对象
				String[] strSubFiles = file0.list();
				for (String strSub : strSubFiles) {
					// 递归调用，遍历当前目录
					printFiles_test02(file0.getAbsolutePath() + File.separator + strSub, strKeyWords);
				}
			} else {
				// 获取文件名
				String file0Name = file0.getName();
				// 添加过滤条件
				if (file0Name.contains(strKeyWords)) {
					// 输出符合过滤条件的文件名
					System.out.println("文件：" + file0.getAbsolutePath());
				}
			}
		}
	}

	/**
	 * （2）从控制台输入一个目录，和查找的关键字，将该目录下的所有的文件的文件名中包含改关键字的文件遍历出来；
	 * 【递归和非递归两种方式实现】【提示可以使用FileFilter或者if条件语句】
	 */
	private static void test03() {
		System.out.println("请输入一个文件路径：");
		Scanner sc = new Scanner(System.in);
		String strFile = sc.nextLine();
		System.out.println("请输入查找关键字：");
		String strKW = sc.nextLine();
		// 递归遍历
		printFiles_test03(strFile, strKW);
	}

	/**
	 * 递归打印文件目录下的所有的信息
	 * 使用FileNameFilter匿名内部类过滤文件名【扩展要求】
	 * 
	 * @param strPath
	 *            文件路径
	 */
	private static void printFiles_test03(String strPath, String strKeyWords) {
		if (strPath != null && !strPath.equals("")) {
			File file0 = new File(strPath);
			// 判断该文件是目录还是文档
			if (file0.isDirectory()) {
				System.out.println("目录：" + file0.getAbsolutePath());
				// 依次递归该目录下的所有的文件对象
				String[] strSubFiles = file0.list(new FilenameFilter() {
					@Override
					public boolean accept(File dir, String name) {
						// 创建当前文件对象
						File file0 = new File(dir + File.separator + name);
						// 判定当前文件是目录还是文档
						if (file0.isDirectory()) {
							// 目录包含在list结果中
							return true;
						} else {
							// 如果是文件，则需要包含 查找关键字，才能包含在list结果中
							if (name != null && name.contains(strKeyWords)) {
								return true;
							}
						}
						// 其他情况不包含在结果List中
						return false;
					}
				});

				for (String strSub : strSubFiles) {
					// 递归调用，遍历当前目录
					printFiles_test03(file0.getAbsolutePath() + File.separator + strSub, strKeyWords);
				}
			} else {
				// 获取文件名
				String file0Name = file0.getName();
				// 添加过滤条件
				if (file0Name.contains(strKeyWords)) {
					// 输出符合过滤条件的文件名
					System.out.println("文件：" + file0.getAbsolutePath());
				}
			}
		}
	}

}
